package com.leapp;

import java.io.FileInputStream;
import java.util.ArrayList;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import android.os.Bundle;
import android.os.Environment;

public class Questionario { //eh um singleton!!
	
	private static Questionario instancia;
	private int questaoAtual =0;
	private ArrayList<Questao> listaQuestoes = new ArrayList<Questao>();
	private String id; 
	
	private Questionario(){
		
	}

	public static Questionario getInstancia(){
		if(instancia==null){
			instancia = new Questionario();
		}
		return(instancia);
	}
	
	public void destroyInstancia(){
		instancia=null;
	}
	
	public void addQuestao(Questao q){
		listaQuestoes.add(q);
	}

	public Questao getQuestao(int questaoNum){
		return listaQuestoes.get(questaoNum);
	}
	
	public Bundle getBundleQuestao(int questaoNum){
		Bundle bundle = new Bundle();
		Questao q = listaQuestoes.get(questaoNum);
		bundle.putString("com.leapp.enunciado", q.getEnunciado());
		bundle.putInt("com.leapp.tipo", q.getTipo());
		bundle.putInt("com.leapp.numero", questaoNum);
		bundle.putStringArrayList("com.leapp.listaItens", q.getItens());
		
		switch(q.getTipo()){
		case Definicoes.QUESTAO_SIMPLES:
			
			break;
		case Definicoes.QUESTAO_MULTIPLA:
			
			break;
		case Definicoes.QUESTAO_TEXTO:
		
			break;
		case Definicoes.QUESTAO_TEXTAO:
		
			break;
		case Definicoes.QUESTAO_ESCALA:
		
			break;
		case Definicoes.QUESTAO_LISTA:
		
			break;
		case Definicoes.QUESTAO_NUMERICA:
		
			break;
		case Definicoes.QUESTAO_GRADE:
		
			break;
		case Definicoes.QUESTAO_GOTO:
		
			break;
		}
		return bundle;	
	}

	public void init(String idQuestionario) {
		id = idQuestionario;
		//Lê o XML com o questionario no servidor
		//Por enquanto vai ler do arquivo em disco
		try{
			SAXParserFactory  saxFac = SAXParserFactory.newInstance();
			SAXParser saxParser = saxFac.newSAXParser();
			XMLReader xmlReader = saxParser.getXMLReader();
			FileInputStream fis = new FileInputStream(Environment.getExternalStorageDirectory().getPath()+"data/"+id+".xml");
			
			//Cria os callbacks para a leitura do XML
			DefaultHandler handler = new DefaultHandler(){
				//Variaveis auxiliares
				Questao q;
				
				int ultimaQuestaoAdicionada =-1;
				
				//Flags
				boolean fenunciado = false;
				boolean fsimples=false;
				boolean fmultipla = false;
				boolean fitem=false;
				
				public void startElement(String uri, String localName,String qName, 
		                Attributes attr) throws SAXException {
					 
					//Trata os tipos de questões
					if(qName.equals("qsimples")){
						q = new Questao();
						q.setTipo(Definicoes.QUESTAO_SIMPLES);
						fsimples = true;
					} else if(qName.equals("qmultipla")){
						q = new Questao();
						q.setTipo(Definicoes.QUESTAO_MULTIPLA);
						fmultipla=true;
					}
					
					//Trata o enunciado
					else if(qName.equals("enunciado")){
						fenunciado = true;
					}
					
					//Trata o elemento principal de cada tipo de questão
					else if(qName.equals("item")){
						fitem=true; 
					}
				}
				
				public void endElement(String uri, String localName,
						String qName) throws SAXException {
					
					//Trata os tipos de questao
					if(qName.equals("qsimples")){
						if(ultimaQuestaoAdicionada != -1)  q.setAnterior(ultimaQuestaoAdicionada); 
						q.setProxima(ultimaQuestaoAdicionada+2);
						ultimaQuestaoAdicionada++;
						addQuestao(q);
						fsimples = false;
					} else if(qName.equals("qmultipla")){
						if(ultimaQuestaoAdicionada != -1)  q.setAnterior(ultimaQuestaoAdicionada); 
						q.setProxima(ultimaQuestaoAdicionada+2);
						ultimaQuestaoAdicionada++;
						addQuestao(q);
						fmultipla = false;
					}
						
					//Trata o enunciado
					else if(qName.equals("enunciado")) fenunciado = false;
					
					//Trata o elemento principal de cada tipo de questão
					else if(qName.equals("item")) fitem=false;
					
					//Acabaram as questões
					else if(qName.equals("questionario")) q.setProxima(-1);
				}
				
				public void characters(char ch[], int start, int length) throws SAXException {
					if(fenunciado) q.setEnunciado(new String(ch,start,length));
					else if(fitem) q.addItem(new String(ch,start,length));	
				}
			};
			
			
			xmlReader.setContentHandler(handler);
			//Lê o XML
			xmlReader.parse(new InputSource(fis));
			
			
		}catch(Exception e){
			e.printStackTrace();
			//Log.e("erro", "Não deu certo "+id);
		}

		
	}
	
	
}
